//+------------------------------------------------------------------+
//|                                               ExpertTrailing.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "ExpertBase.h"  // EA基础类（提供品种、价格序列等通用能力）

//+------------------------------------------------------------------+
//| CExpertTrailing 类：EA 移动止损（追踪止损）基类                   |
//| 核心定位：继承自 CExpertBase，定义移动止损的标准接口，提供多单/空单 |
//|           止损止盈动态调整的抽象逻辑，子类可重写实现具体追踪策略，   |
//|           如固定点数追踪、波动率追踪、均线追踪等                 |
//| 核心价值：标准化止损调整流程，隔离止损逻辑与交易执行模块，便于策略   |
//|           迭代与多样化止损策略的扩展（如同一 EA 可切换不同追踪模式） |
//| 适用场景：所有需要动态调整止损止盈的 EA 策略，尤其适合趋势跟踪策略， |
//|           通过移动止损锁定盈利、规避回调风险（如趋势中自动上移止损） |
//+------------------------------------------------------------------+
class CExpertTrailing : public CExpertBase
  {
public:
   //----------------------------------------------------------------
   // 构造与析构函数
   //----------------------------------------------------------------
   /**
    * @brief 构造函数：初始化移动止损对象
    * @details 1. 调用父类 CExpertBase 构造函数，继承品种、价格序列等通用能力；
    *          2. 无自定义成员变量，无需额外初始化逻辑，保持基类简洁性；
    *          3. 所有具体追踪策略的参数初始化由子类实现（如追踪点数、ATR周期等）。
    */
                     CExpertTrailing(void);

   /**
    * @brief 析构函数：清理移动止损对象资源
    * @details 1. 调用父类 CExpertBase 析构函数，释放通用资源；
    *          2. 无自定义动态资源，确保内存安全，避免子类析构冲突。
    */
                    ~CExpertTrailing(void);

   //----------------------------------------------------------------
   // 移动止损核心接口（子类必须重写，实现具体调整逻辑）
   //----------------------------------------------------------------
   /**
    * @brief 调整多单（买入）的止损止盈价格（纯虚接口，子类重写实现具体策略）
    * @param position [in] 持仓信息对象（包含当前持仓价格、手数、止损止盈等）
    * @param sl [out] 调整后的止损价格（若无需调整，保持原价格）
    * @param tp [out] 调整后的止盈价格（若无需调整，保持原价格，多数策略仅调整止损）
    * @return bool - 调整结果：true=止损/止盈已调整，false=未调整（价格不变）
    * @note 多单追踪逻辑示例（子类可实现）：
    *       1. 固定点数追踪：当价格上涨N点后，止损上移至开仓价+M点；
    *       2. ATR追踪：止损=当前最低价 - ATR值×倍数，随价格上涨自动上移；
    *       3. 均线追踪：止损=最近5根K线的最低价，价格创新高后更新止损。
    */
   virtual bool      CheckTrailingStopLong(CPositionInfo *position, double &sl, double &tp)  { return(false); }

   /**
    * @brief 调整空单（卖出）的止损止盈价格（纯虚接口，子类重写实现具体策略）
    * @param position [in] 持仓信息对象（包含当前持仓价格、手数、止损止盈等）
    * @param sl [out] 调整后的止损价格（若无需调整，保持原价格）
    * @param tp [out] 调整后的止盈价格（若无需调整，保持原价格，多数策略仅调整止损）
    * @return bool - 调整结果：true=止损/止盈已调整，false=未调整（价格不变）
    * @note 空单追踪逻辑示例（子类可实现，与多单对称）：
    *       1. 固定点数追踪：当价格下跌N点后，止损下移至开仓价-M点；
    *       2. ATR追踪：止损=当前最高价 + ATR值×倍数，随价格下跌自动下移；
    *       3. 均线追踪：止损=最近5根K线的最高价，价格创新低后更新止损。
    */
   virtual bool      CheckTrailingStopShort(CPositionInfo *position, double &sl, double &tp) { return(false); }
  };
//+------------------------------------------------------------------+